package com.rayframework.context.utils;


import com.ray.tool.RayConsole;
import com.ray.tool.common.enums.ConsoleColorEnum;
import com.ray.tool.common.enums.RayLogLevelEnum;
import com.rayframework.context.RayApplicationContext;

/**
 * 控制台输出 - 工具类
 * 提供给用户
 * 仅依赖于JDK8
 *
 * @author LiaoYuXing-Ray
 * @version 1.0
 * @createDate 2023/8/29 15:36
 **/
@SuppressWarnings("unused")
public class RayConsoleUtils {

    /**
     * 工具类中的方法都是静态方法访问的，因此将构造器私有不允许创建对象
     *
     * @author LiaoYuXing-Ray 2023/9/7 10:24
     */
    private RayConsoleUtils() {
        throw new AssertionError();
    }

    /**
     * 控制台日志 - DIY款
     * 可接受自定义输出款式
     *
     * @param args 输出参数
     * @author LiaoYuXing-Ray 2023/9/15 17:54
     **/
    public static void info(Object... args) {
        RayConsole.info(RayLogLevelEnum.INFO, getConsoleColorInApplicationProperty(), args);
    }

    /**
     * 控制台日志 - DIY款
     * 可接受自定义输出款式
     *
     * @param args 输出参数
     * @author LiaoYuXing-Ray 2023/9/15 17:54
     **/
    public static void debug(Object... args) {
        RayConsole.debug(RayLogLevelEnum.DEBUG, getConsoleColorInApplicationProperty(), args);
    }

    /**
     * 控制台日志 - DIY款
     * 可接受自定义输出款式
     *
     * @param args 输出参数
     * @author LiaoYuXing-Ray 2023/9/15 17:54
     **/
    public static void warn(Object... args) {
        RayConsole.warn(RayLogLevelEnum.WARN, getConsoleColorInApplicationProperty(), args);
    }

    /**
     * 控制台日志 - DIY款
     * 可接受自定义输出款式
     *
     * @param args 输出参数
     * @author LiaoYuXing-Ray 2023/9/15 17:54
     **/
    public static void error(Object... args) {
        RayConsole.error(RayLogLevelEnum.ERROR, getConsoleColorInApplicationProperty(), args);
    }

    /**
     * 控制台日志 - 简约款
     * 单纯输出日志
     *
     * @param args 输出参数
     * @author LiaoYuXing-Ray 2023/9/15 17:54
     **/
    public static void out(Object... args) {
        RayConsole.out(args);
    }

    /**
     * 控制台日志 - 简约款
     * 单纯输出日志（红色）
     *
     * @param args 输出参数
     * @author LiaoYuXing-Ray 2023/9/15 17:54
     **/
    public static void err(Object... args) {
        RayConsole.err(args);
    }

    /*
        在Java中，可以使用ANSI转义序列来在控制台输出带有颜色的文本。
        这些序列是一种特殊的字符序列，可以改变终端文本的颜色和样式。
        以下是一些基本的ANSI转义序列：
        \033[0m：重置所有属性
        \033[1m：设置高亮度
        \033[4m：下划线
        \033[5m：闪烁
        \033[7m：反显
        \033[30m - \033[37m：设置前景色（30-37）
        \033[40m - \033[47m：设置背景色（40-47）
        30: 黑色 black    BLACK
        31: 红色 red      RED
        32: 绿色 green    GREEN
        33: 黄色 yellow   YELLOW
        34: 蓝色 blue     BLUE
        35: 紫色 purple   PURPLE
        36: 青色 cyan     CYAN
        37: 白色 white    WHITE
    */

    /**
     * 通过配置文件中配置的  框架-控制台-输出日志-文本-颜色=有效颜色字符串
     * 判断是否有效，然后返回对应的颜色ANSI转义序列
     * 如果是无效值，返回默认的白色
     *
     * @return java.lang.Integer 对应的颜色ANSI转义序列
     * @author LiaoYuXing-Ray 2023/9/15 17:19
     **/
    private static ConsoleColorEnum getConsoleColorInApplicationProperty() {
        String colorValue = RayApplicationContext
                .getApplicationPropertyValue(true, "Ray.Console.print.text.color");
        for (ConsoleColorEnum color : ConsoleColorEnum.values()) {
//             忽略大小写
            if (color.getDesc().equalsIgnoreCase(colorValue)) {
                return color;
            }
        }
        // 如果是无效值，返回默认的白色，并设置回默认
        RayApplicationContext.updateApplicationConfigMapValue(
                "Ray.Console.print.text.color", ConsoleColorEnum.WHITE.getDesc());
        return ConsoleColorEnum.WHITE;
    }
}
